function f_delete_for_string()
{
    #这个函数是删除引号之间的字符, 主要是为了方便处理sql, 相当于格式化sql的前期工作, 这部分代码可以优化一下，match函数可以简化很多代码
    declare _sed_opt _res_str
    _sed_opt="${1}"
    _res_str="$(cat -|awk '
    BEGIN {
        state = 0; #作用在get_res函数, 作为返回状态值. 如果单引号里有双引号, 或者双引号里有单引号, 这个值就返回1, 否则是0
        char_role = "'\''";                            #默认使用单引号作为分割
        oppose_char_role = "'\''";                     #char_role 的对立, 如果char_role是单引号oppose_char_role就是双引号
        stop_mark = 0;                                 #判断文件是否是最后一行, 主要是用来处理一对引号分在多行的场景
        head_str = "";                       #主要是用来处理一对引号分在多行的场景, 如果一对引号分在多行, 则将第一个引号后面的字符串先保存在这个变量
        res[1] = "";                                   #定义一个第一个值是空的数组, 将结果保存在这个数组, 遍历的时候需要从2开始
        
    }
    function f_get_res_for_str(str_res) {  
        #处理字符串的函数, 去掉单引号内的字符, 去掉双引号内的字符
        #如果上一行处理结束后存在单引号或者双引号不成对就会将第一次出现单引号或者双引号后面的字符保存在head_str变量
        str_res = head_str "" str_res;                 
        head_str = "";                                 #使用完就清空
        split(str_res, a, char_role);                  #以双引号作为分割, 并放在a数组
        res_tmp = "";                                  #每次执行都清空res_tmp变量, 
        if (length(a) == 1 ) {                         #如果该行没有引号就直接返回
            res_tmp = res_tmp "" a[1];
            if (char_role == "'\''") {
                state = 1;
            }
            return 0;
        }
        for(i=1; i<= length(a); i++) {                 #根据数组a的长度去遍历
            if(i % 2 != 0) {
                #因为根据单引号或者双引号去分割可以视为被分割后是三个部分, a[2]是引号引起来的部分, 如  1'2'3 a[1]=1, a[2]=2, a[3]=3
                #所以这部分是将 非引号引起来的部分保存到res_tmp变量, 以此实现删除引号引起来的部分
                str = a[i];                            #用临时变量保存下a[i]的值
                #char_role = "\"", 则判断a[i]是否有单引号, str_length = 0表示没有, 反之char_role = 单引号则判断是否有双引号
                str_length = gsub(oppose_char_role, "", str)  
                if (str_length % 2 == 0) {             #str_length % 2 = 0, 表示成对出现, 可以不用管
                    split(a[i], b, char_role);         #成对出现的时候, 对a[i]重新分割保存到新的数组b, 方便将这对引号内的字符处理掉
                    for(j=1; j <= length(b); j++) {    #对a[i]重新分割后遍历新的数组b, 并将非引号内的部分保存下来
                        if(j % 2 != 0) {
                            res_tmp = res_tmp "" b[j];
                        }
                    }
    
                } else if (str_length != 0){           
                    # i 的值可以理解未只有两种情况, 被2整除 和 其他
                    #如这种情况 '\''sfdsf"dfsafds'\'', 单个双引号在单引号引起来部分, 综上, 这时候切换split的分隔符, 单引号换双引号, 双引号换单引号
                    for(j=i; j<= length(a); j++) {     #将i之后的
                        #j > i && j % 2 == 0部分配上引号, 即原来引号引起来的部分,在这种情况下要重新给这部分配上引号, 可以理解未将串还原成原来的
                        if(j % 2 == 0 && j == length(a)) {   
                            #j=length(a)表示这个段是最后一个段
                            #这部分是解决目标分割引号在单行不成对问题, 如果不成对就需要还原
                            #比如当前是以单引号作为分割, 有如下字符串"'\''string, 这时候需要将"'\''还原到原来的串
                            if (length(a[j]) == 0) { 
                                #j % 2 == 0表示该段应该是偶数部分, 即应该是引号之间的部分, 如果这部分是空串, 则表示这个串是引号结束的[string'\'']
                                res_tmp = res_tmp "" a[j] "" char_role "";
                            } else {
                                #j % 2 == 0表示该段应该是偶数部分, 即应该是引号之间的部分, 如果这部分不是空串, 则表示这个串是引号开始的['\''string]
                                res_tmp = res_tmp "" char_role "" a[j] "";
                            }
                        } else if(j % 2 == 0) {
                                res_tmp = res_tmp "" char_role "" a[j] "" char_role "";
                        } else {
                            res_tmp = res_tmp "" a[j];     #j % 2 != 0部分直接还原
                        }
                    }
                    state = 1;                             #表示处理该行遇到需要切换分割符的情况
                    return 0;
    
                } else {                                   #没有其他引号的直接处理, 处理完成continue开始下一个段
                    res_tmp = res_tmp "" a[i];
                    continue;
                }
            } else if (i == length(a)) { 
                #按说如果引号成对, length(a)应该是奇数, 这里的else部分则表示i是偶数, 所以这里 i == length(a) 就是表示如果不成对
                if (length(a[i]) == 0) {
                    #表示该段应该是偶数部分, 即应该是引号之间的部分, 如果这部分是空串, 则表示这个串是引号结束的[string'\'']
                    head_str = a[i] "" char_role "";
                } else {
                    #表示该段应该是偶数部分, 即应该是引号之间的部分, 如果这部分不是空串, 则表示这个串是引号开始的['\''string]
                    head_str = char_role "" a[i];
                }
            }
        }
        str = res_tmp; #将处理的结果保存到临时变量, 用于判断结果是否还有单引号或者双引号, 如果有则设置state = 1, 即继续处理
        str_length = gsub(oppose_char_role, "", str)
        if ( str_length != 0 ) {
            state = 1;
        }
    }
    {
        res_tmp = $0;                                  #保存经过处理的行每行
        gsub("\\\\'\''", "", res_tmp);                 #去掉字符串的[\\'\'']这种符号, 一个转义符+单个单引号
        gsub("\\\\\"", "", res_tmp);                   #去掉字符串的[\"]这种符号, 一个转义符+单个双引号
        char_role = "'\''";                            #处理完一行重新定义分割符, 按照单引号还是双引号, 默认是从单引号开始
        oppose_char_role = "\"";                       #同char_role
        for (;0<1;) {
            f_get_res_for_str(res_tmp);                          #处理当前行, 去掉引号引起来的部分
            res_tmp = res_tmp;                         #保存临时结果
            #state = 1表示当前行没有处理完成, 如当前是以单引号分割, 但是处理该行的时候遇到了双引号, 这时候需要切换分割符重新处理
            if (state == 1 && char_role == "'\''") { 
                char_role = "\"";                      #切换分割符
                oppose_char_role = "'\''";
            } else if (state == 1 && char_role == "\"") {
                char_role = "'\''";                    #切换分割符
                oppose_char_role = "\"";
            } else {
                break;                                 #处理完成
            }
            state = 0;
        }
        res[length(res)+1] = res_tmp;                  #将处理完成的行保存到res数组
    
    } END { 
        for (i=2; i <= length(res); i++) {
            print res[i];
        }
        if (length(head_str) != 0) {
            print "[ "strftime("%Y-%m-%d %H:%M:%S",systime())" ] [ 错误 ] [ 出现引号("char_role")不成对的情况,不成对部分如下,请检查.] [ " head_str " ]";
            exit 1;
        }
    }')"

    if [ -n "${_sed_opt}" ]
    then
        echo "${_res_str}"
    else
        echo "${_res_str}"|sed -r '
        s#\<index\> *[a-zA-Z0-9_]*\([^\)]+\) *[,;]? *#index #gi;
        s#\<key\> *[a-zA-Z0-9_]*\([^\)]+\) *[,;]? *#key #gi;
        s#\<decimal\> *\([^\)]+\) *[,;]? *#decimal #gi;
        s#\<add\> *\([^\)]+\) *[,;]? *#add #gi;
        s#\<add\> *column *\([^\)]+\) *[,;]? *#add column #gi'
    fi
    #这部分sed是去掉index|key|decimal|add [column](xx,xxx)这种字符串, 因为这种可能带有逗号导致匹配异常
    return 0
}

